/* ****************************************************************************
 *
 * Copyright (c) Microsoft Corporation. 
 *
 * This source code is subject to terms and conditions of the Microsoft Public License. A 
 * copy of the license can be found in the License.html file at the root of this distribution. If 
 * you cannot locate the  Microsoft Public License, please send an email to 
 * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound 
 * by the terms of the Microsoft Public License.
 *
 * You must not remove this notice, or any other, from this software.
 *
 *
 * ***************************************************************************/

using System;
using Microsoft.Scripting.Ast;

namespace Microsoft.Scripting.Actions {
    internal class ParameterMetaObject : MetaObject {
        private readonly Expression _original;

        internal ParameterMetaObject(Expression expression, object value)
            : this(expression, expression, Restrictions.Empty, value) {
        }

        internal ParameterMetaObject(Expression expression, Expression original, Restrictions restrictions, object value)
            : base(expression, restrictions, value) {
            _original = original;
        }

        internal override MetaObject RestrictImpl(Type type) {
            return new ParameterMetaObject(
                Expression.ConvertHelper(
                    Expression, Microsoft.Scripting.Generation.CompilerHelpers.GetVisibleType(type)
                ),
                _original,
                Restrictions.Merge(Restrictions.TypeRestriction(_original, type)),
                Value
            );
        }
    }
}
